#include <stdlib.h>
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <opencv2/objdetect.hpp>

// Подсчитать количество объектов на растровом изображении
// Предназначено для подсчёта лиц "в фас",
// но может использоваться и для другого класса объектов.
// License: MIT

void MaskFaces(
  char *fn,
  char *fno,
  int defR,
  int defG,
  int defB,
  char *fnc
) {

  cv::Mat gray = cv::imread(fn, cv::IMREAD_GRAYSCALE);
  int w = gray.cols;
  int h = gray.rows;

  cv::CascadeClassifier *cs = new cv::CascadeClassifier();
  std::vector<cv::Rect> objects;
  cs->load(fnc);
  cs->detectMultiScale(
    gray,
    objects,
    1.1,
    3,
    cv::CASCADE_FIND_BIGGEST_OBJECT,
    cv::Size(12,12), // for Haar
    cv::Size(w,h)
  );
  cv::Mat frame = cv::imread(fn, cv::IMREAD_COLOR);
  for(int k = 0; k < objects.size(); k++) {
    cv::Rect r = objects[k];
    cv::Point p1(r.x, r.y);
    cv::Point p2(r.x + r.width - 1, r.y + r.height - 1);
    cv::rectangle(frame, p1, p2, CV_RGB(defR, defG, defB), cv::FILLED);
  }
  cv::imwrite(fno, frame);
}

int main (int argc, char **argv) {
  if (argc < 3) {
    std::cout << "No args" << std::endl;
    std::cout << "Usage: facedetect-cv image-file output-image [obj-cascade.xml]" << std::endl;
    return 1;
  }
  char *fn = argv[1];
  char *fno = argv[2];
  char *fnc = (char *)"/usr/share/data/facedetect-cv/haarcascade_frontalface_alt.xml";
  if (argc > 3) fnc = argv[3];
  MaskFaces(
    fn,
    fno,
    0,
    0,
    0,
    fnc
  );
  return 0;
}
